#ifndef DRAGGABLELINEITEM_H
#define DRAGGABLELINEITEM_H

#include <QGraphicsLineItem>
#include <QGraphicsSceneMouseEvent>
#include <QObject>

/**
 * @brief 可拖动的线条项类
 * 支持水平/垂直线条的拖动，并根据线条方向限制移动方向
 */
class DraggableLineItem : public QObject, public QGraphicsLineItem
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param parent 父图形项
     */
    DraggableLineItem(QGraphicsItem *parent = nullptr);
    
    /**
     * @brief 构造函数，带初始线条
     * @param line 初始线条
     * @param parent 父图形项
     */
    DraggableLineItem(const QLineF &line, QGraphicsItem *parent = nullptr);
    
    /**
     * @brief 设置线条是否为垂直线
     * @param isVertical true表示垂直线，false表示水平线
     */
    void setVertical(bool isVertical);
    
    /**
     * @brief 获取线条是否为垂直线
     * @return true表示垂直线，false表示水平线
     */
    bool isVertical() const;
    
protected:
    /**
     * @brief 鼠标按下事件处理
     * @param event 鼠标事件
     */
    void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
    
    /**
     * @brief 鼠标移动事件处理
     * @param event 鼠标事件
     */
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
    
    /**
     * @brief 鼠标释放事件处理
     * @param event 鼠标事件
     */
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
    
    /**
     * @brief 鼠标悬停进入事件处理
     * @param event 悬停事件
     */
    void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;
    
    /**
     * @brief 鼠标悬停离开事件处理
     * @param event 悬停事件
     */
    void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override;
    
    // 为了让QObject正常工作，需要重写QGraphicsItem的type方法
    enum { Type = UserType + 1 };
    int type() const override { return Type; }

protected:
    /**
     * @brief 图形项变化事件
     * @param change 变化类型
     * @param value 变化值
     * @return 变化后的值
     */
    QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
signals:
    /**
     * @brief 位置变化信号
     */
    void positionChanged();
    
private:
    bool m_isVertical;       // 是否为垂直线
    bool m_isDragging;       // 是否正在拖动
    QPointF m_dragOffset;    // 拖动偏移量
};


#endif // DRAGGABLELINEITEM_H
